
package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Wilson
 */

/************************************************ /
<y> ::= *<nome> | {[]} <nome> {[]}
/*************************************************/

// WIlsoooonnn!! Mudei algumas coisas aqui viu! [2]

public class Y {
    public boolean y(TabelaSimbolos tabelaSimbolos) {
        
        if(tabelaSimbolos.getLookahead().equals("*")) {

            tabelaSimbolos.salvaItemListaParametro("*");

            tabelaSimbolos.soConsome();
            // insere tipo
            tabelaSimbolos.insertTipoVariavel();
            // insere o escopo
            tabelaSimbolos.insertEscopo();
            // insere categoria
            tabelaSimbolos.insertCategoria("variavel");
            if(tabelaSimbolos.getTipo().equals("identificador")) {
                tabelaSimbolos.soConsome();
                return true;
            }
            else
            {
                ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Deveria ser um identificador");
                TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                return false;
            }
        }
        
        if(tabelaSimbolos.getLookahead().equals("[")) {
            while(tabelaSimbolos.getLookahead().equals("[")) {
                if(tabelaSimbolos.reconhecer("[")) {
                    if(!tabelaSimbolos.reconhecer("]"))
                        return false;
                }
                else return false;
            }
        }

        if(tabelaSimbolos.getTipo().equals("identificador")) {
            tabelaSimbolos.soConsome();

            if(tabelaSimbolos.getLookahead().equals("[")) {
                while(tabelaSimbolos.getLookahead().equals("[")) {
                    if(tabelaSimbolos.reconhecer("[")) {
                        if(!tabelaSimbolos.reconhecer("]"))
                            return false;
                    }
                    else return false;
                }
            }
            else return true;
        }

        return true;
    }
}
